home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Technology Seed / Mac Tech Seed Feb '97.toast / OpenDoc 1.2b2c1 / OpenDoc / OpenDoc Utilities / Interfaces / Node.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-01  |  3.2 KB  |  122 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Node.h
  3.  
  4.     Contains:    Tree node class
  5.  
  6.     Owned by:    Richard Rodseth
  7.  
  8.     Copyright:    © 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <2>     5/24/96    jpa        1.1MRD: pragma internal eliminates NOPs.
  13.                                     Inlined methods.
  14.     
  15.     In Progress:
  16.     
  17. */
  18.  
  19. #ifndef _NODE_
  20. #define _NODE_
  21.  
  22. #ifndef _ODTYPES_
  23. #include "ODTypes.h"
  24. #endif
  25.  
  26. #ifndef _LINKLIST_
  27. #include "LinkList.h"
  28. #endif
  29.  
  30. //=====================================================================================
  31. // Classes defined in this interface
  32. //=====================================================================================
  33.  
  34. class Node;
  35. class NodeTraverser;
  36.  
  37. //=====================================================================================
  38. // Class Node
  39. //=====================================================================================
  40.  
  41. #ifdef PRAGMA_INTERNAL_SUPPORTED
  42. #pragma internal on
  43. #endif
  44.  
  45. class  Node : private Link, private LinkedList
  46. {
  47.     public:
  48.         Node();
  49.         ~Node();
  50.  
  51.         ODULong Size();
  52.         
  53.         Node* GetParent()                                    {return fParent;}
  54.         Node* GetFirstChild()                                {return (Node*) this->First();}
  55.         Node* GetLastChild()                                {return (Node*) this->Last();}
  56.         Node* GetNextSibling();
  57.         Node* GetPreviousSibling();
  58.             
  59.         void SetParent(Node* parent)                        {fParent = parent;}
  60.         
  61.         void AddChildFirst(Node* node)                        {node->SetParent(this);
  62.                                                              this->AddFirst(node);}
  63.         void AddChildLast(Node* node)                        {node->SetParent(this);
  64.                                                              this->AddLast(node);}
  65.         void AddChildBefore(Node& existing, Node* node)        {node->SetParent(this);
  66.                                                              this->LinkedList::AddBefore(existing, node);}
  67.         void AddChildAfter(Node& existing, Node* node)        {node->SetParent(this);
  68.                                                              this->LinkedList::AddAfter(existing, node);}
  69.         void RemoveChild(Node& node)                        {this->LinkedList::Remove(node);}
  70.         Node* GetChildAfter(Node* node)                        {return (Node*) this->After(*node);}
  71.         Node* GetChildBefore(Node* node)                    {return (Node*) this->Before(*node);}
  72.  
  73.         Node* FirstTopDown()                                {return this;}
  74.         Node* NextTopDown(ODSiblingOrder siblingOrder);
  75.         Node* GetNextAunt(ODSiblingOrder siblingOrder);
  76.         
  77.         Node* FirstBottomUp(ODSiblingOrder siblingOrder);
  78.         Node* NextBottomUp(ODSiblingOrder siblingOrder);
  79.  
  80.     private:
  81.         Node*        fParent;
  82. };
  83.  
  84. //=====================================================================================
  85. // Class NodeTraverser
  86. //=====================================================================================
  87.  
  88.  
  89. class NodeTraverser 
  90. {
  91. public:
  92.  
  93.     NodeTraverser(Node* root, 
  94.                   ODTraversalType traversalType, 
  95.                   ODSiblingOrder siblingOrder);
  96.     ~NodeTraverser()                                        { }
  97.  
  98.     Node*                First();
  99.     Node*                Next();
  100.     void                SkipChildren();
  101.     ODBoolean            IsNotComplete()                        {return (fCurrent != kODNULL);}
  102.  
  103. protected:    
  104.  
  105.     Node* FirstTopDown(Node* node)                            {return node;}
  106.     Node* NextTopDown(Node* node, ODSiblingOrder siblingOrder);
  107.     Node* GetNextAunt(Node* node, ODSiblingOrder siblingOrder);
  108.     Node* FirstBottomUp(Node* node, ODSiblingOrder siblingOrder);
  109.     Node* NextBottomUp(Node* node, ODSiblingOrder siblingOrder);
  110.     
  111. private:
  112.       Node*             fRoot;
  113.      Node*             fCurrent;
  114.      ODTraversalType fTraversalType;
  115.      ODSiblingOrder  fSiblingOrder;
  116. };
  117.  
  118. #ifdef PRAGMA_INTERNAL_SUPPORTED
  119. #pragma internal reset
  120. #endif
  121.  
  122. #endif // _NODE_